package com.base.demo.design.test.algorithm;

/**
 * @Description: 切面条算法  https://edu.csdn.net/skill/algorithm/algorithm-530255df51be437b967cbc4524fe66ea?category=188
 * 一根高筋拉面，中间切一刀，可以得到2根面条。
 * 如果先对折1次，中间切一刀，可以得到3根面条。
 * 如果连续对折2次，中间切一刀，可以得到5根面条。
 * 那么，连续对折10次，中间切一刀，会得到多少面条呢？
 * @BelongsProject: base-demo-design
 * @BelongsPackage: com.base.demo.design.test.algorithm
 * @Author: ChenYongJia
 * @CreateTime: 2022-06-07 17:46
 * @Email: chen87647213@163.com
 * @Version: 1.0
 */
public class CutTheNoodles {

    /**
     * 问题分析
     * 1、不对折（对折零次），从中间切一刀，得到 2 根面条， 2 = 2
     * 2、对折一次，从中间切一刀，得到 3 根面条， 3 = 2 + 2^0
     * 3、对折两次，从中间切一刀，得到 5 根面条， 5 = 2 + 2^0 + 2^1
     * 4、对折三次，从中间切一刀，得到 9 根面条， 9 = 2 + 2^0 + 2^1 + 2^2
     * …
     * 11、对折十次，从中间切一刀，得到 2 + 2^0 + 2^1 + 2^2 + ...... + 2^9 根面条
     *
     * @param times 对折次数
     * @return int
     * @date 2022/6/7 17:46
     * @author ChenYongJia
     * @version 1.0
     */
    public static int cut_noodles(int times) {
        int result = 2, t = 1;
        for (int i = 0; i < times; i++) {
            result += t;
            t = t * 2;
        }
        return result;
    }


    public static void main(String[] args) {
        // 对折的次数
        int times = 10;
        int result = cut_noodles(times);
        System.out.printf("对折 %d 次从中间切一刀得到的面条数是: %d\n", times, result);
    }

}
